#include <iostream>
#include <string>
using namespace std;


namespace HU
{


    class A
    {
        private:
            int i;
            
        public:
            // 类中的静态成员变量，表示该成员变量被所有的对象共享，可以直接进行初始化赋值
            static int y;
            void set(int x)
            {
                i = x;
            }

            int get()
            {
                return i;
            }
            static void init()
            {
                cout << "static function " << y << endl;
            }
    };
};


namespace HU1
{
    class B
    {

        private:
            int i;
        public:
            int year;
            float nums;
            void set(int x)
            {
                this->i = x;
                cout << "this 的地址: " << this << endl;
            }
            
            int get()
            {
                return this->i;
            }

            // 返回是左值引用
            B & add(int a)
            {
                this->i += a;
                return *this;
            }

            // 返回类型
            B add_k(int a)
            {
                this->i += a;
                return *this;
            }
            // B()
            // {
            //     cout << "B 构造函数" << endl;
            // }
            B(int year = 2023,float nums = 23.4)
            {
                this->year = year;
                this->nums = nums;
                cout << "B 构造函数" << endl;
            }
            virtual ~B()
            {
                cout << "B 析构函数" << endl;
            }

    };

    class C
    {
        // public:
        //     void hu();
    };
};


int HU::A::y = 13;

int main(int argc, char *argv[])
{

    // 普通的赋值
    { 
        using namespace HU;
        
        // 静态函数可以通过类名直接调用
        A::init();
        // 静态变量可以直接通过类名直接访问
        cout << A::y << endl;
        cout << "**********" << endl;
        A a;
        a.set(67);
        cout << a.get() << endl;
        cout << a.y << endl;

        cout << "a.y: " << endl;
        a.init();

        A a1;
        cout << "a1.y: " << endl;
        a1.init();
        

    }

    // this 指针的使用
    {
        using namespace HU1;

        B b;
        
        cout << "实例b的地址: " << &b << endl;
        b.set(10);
        b.add_k(10).add_k(10).add_k(10);
        cout << b.get() << endl;
    }

    // this 指针的使用 
    {
        using namespace HU1;

        B b = B(2013,45.6);
        // B b = B();
        cout << "year: " << b.year << " nums: " << b.nums << endl;
        
        cout << "实例b的地址: " << &b << endl;
        b.set(10);
        b.add(10).add(10).add(10);
        cout << b.get() << endl;
    }

    // 空类，空类会有一个字节的占位符，或者只有普通成员函数的类，也是只有一个字节的占位符
    {
        using namespace HU1;
        C c;

        cout << "C 类的大小: " << sizeof(C) << endl;
    }

    {
        char input[64] = {0};

        string str = string(input);
        getline(cin,str);

        cout << str << "\n" << sizeof(input) << endl;
    }
    



    return 0;
}